#ifndef CHATSERVICE_H
#define CHATSERVICE_H

#include"json.hpp"
using json = nlohmann::json;

#include"offlinemessagemodel.hpp"
#include"usermodel.hpp"
#include"friendmodel.hpp"
#include"groupmodel.hpp"
#include"chatAImodel.hpp"
#include"redis.hpp"

#include<muduo/net/TcpConnection.h>
#include<unordered_map>
#include<functional>
#include<mutex>
#include<vector>

using namespace std;
using namespace muduo;
using namespace muduo::net;


// 处理消息的事件方法回调类型
using MsgHandler = std::function<void(const TcpConnectionPtr&conn,
                                    json& js,Timestamp )>;

// 聊天服务业务类 使用这种方法进行 业务和网络io进行分离
class ChatService
{
public:
    // 获取单例对象的接口
    static ChatService* instance();
    // 处理登录业务
    void login(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 处理注册业务
    void reg(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 一对一聊天业务
    void oneChat(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 添加好友业务
    void addFriend(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 创建群聊
    void createGroup(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 加入群聊
    void addGroup(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 群组聊天
    void groupChat(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 处理注销消息
    void loginout(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 与ai进行对话
    void chatAI(const TcpConnectionPtr&conn,json& js,Timestamp time);
    // 供给redis的回调操作
    void handleRedisSubscribeMessage(int,string);
    // 获取消息对应的处理器
    MsgHandler getHandler(int msgid);
    // 处理客户端异常退出
    void clientCloseException(const TcpConnectionPtr&conn);
    // 服务器异常结束后 业务重置方法
    void reset();
private:

    ChatService(); 
    // 存储消息id 和其对应的业务处理方法
    unordered_map<int,MsgHandler> _msgHandlerMap;

    // 存储在线用户的通信连接  这个访问要注意线程安全c++容器未考虑线程安全
    unordered_map<int,TcpConnectionPtr> _userConnMap;

    // 用于存储当前用户的AI历史聊天  userid:msg 
    // 每当有用户对ai产生消息的时候加入数据，当用户注销的时候释放数据
    unordered_map<int,vector<json>> _aiMsg;

    // 定义互斥锁，保证线程安全
    mutex _connMutex;
    // ai模块数据的互斥锁
    mutex _aiMutex;

    // 数据操作类对象
    UserModel _userModel;
    OfflineMsgModel _offlineMsgModel;
    FriendModel _friendModel;
    GroupModel _groupModel;
    ChatAIModel _aiModel;

    

    Redis _redis;
};

#endif